﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using MobilnyDostawca;
using MobilnyDostawca.Repositories;
using MobilnyDostawca.ViewModels;

namespace MobilnyDostawca.Controllers
{ 
    [Authorize]
    public class ParcelController : Controller
    {
        //
        // GET: /Parcel/
        public ActionResult Index(PrzesylkiIndexFilterViewModel model)
        {
            return View(LoadPrzesylkiIndexViewModel(Repository.GetParcelsWithFiltersConditions(model)));
        }
        //
        // POST: /Parcel/
        [HttpPost]
        public ActionResult FilterParcels(PrzesylkiIndexFilterViewModel model)
        {
            return RedirectToAction("Index", LoadPrzesylkiIndexViewModel(Repository.GetParcelsWithFiltersConditions(model)));
        }

        //
        // GET: /Parcel/Details/5
        public ActionResult Details(int id)
        {
            return View(LoadPrzesylkiViewModel(Repository.GetParcelByID(id)));
        }

        //
        // GET: /Parcel/Create
        public ActionResult Create()
        {
            PrzesylkiCreateViewModel przesylkiCreateViewModel = new PrzesylkiCreateViewModel();
            LoadPrzesylkiCreateViewModel(przesylkiCreateViewModel);
            return View(przesylkiCreateViewModel);
        }

        private void LoadPrzesylkiCreateViewModel(PrzesylkiCreateViewModel przesylkiCreateViewModel)
        {
            przesylkiCreateViewModel.NadawcaRegiony = new List<SelectListItem>();
            przesylkiCreateViewModel.NadawcaRegiony.AddRange(Repository.GetAllRegionsSelectItemList());
            przesylkiCreateViewModel.OdbiorcaRegiony = new List<SelectListItem>();
            przesylkiCreateViewModel.OdbiorcaRegiony.AddRange(Repository.GetAllRegionsSelectItemList());
            przesylkiCreateViewModel.NadawcaSubregiony = new List<SelectListItem>();
            przesylkiCreateViewModel.NadawcaSubregiony.AddRange(Repository.GetAllSubregionsSelectItemList());
            przesylkiCreateViewModel.OdbiorcaSubregiony = new List<SelectListItem>();
            przesylkiCreateViewModel.OdbiorcaSubregiony.AddRange(Repository.GetAllSubregionsSelectItemList());
        } 

        //
        // POST: /Parcel/Create
        [HttpPost]
        public ActionResult Create(PrzesylkiCreateViewModel przesylkiCreateViewModel)
        {
            if (ModelState.IsValid)
            {
                Repository.AddParcel(przesylkiCreateViewModel);
                return RedirectToAction("Index");  
            }

            LoadPrzesylkiCreateViewModel(przesylkiCreateViewModel);
            return View(przesylkiCreateViewModel);
        }
        
        //
        // GET: /Parcel/Edit/5
        public ActionResult Edit(int id)
        {
            return View(LoadPrzesylkiChangeViewModel(Repository.GetParcelByID(id)));
        }

        //
        // POST: /Parcel/Edit/5
        [HttpPost]
        public ActionResult Edit(PrzesylkiChangeViewModel przesylkiChangeViewModel)
        {
            if (ModelState.IsValid)
            {
                Repository.UpdateStatus(przesylkiChangeViewModel);
                return RedirectToAction("Index");
            }
            przesylkiChangeViewModel.Statusy = new List<SelectListItem>();
            przesylkiChangeViewModel.Statusy.AddRange(Repository.GetStatusesSelectItemListForSupervisor());
            return View(przesylkiChangeViewModel);
        }

        //
        // GET: /Parcel/Delete/5
        public ActionResult Delete(int id)
        {
            return View(LoadPrzesylkiViewModel(Repository.GetParcelByID(id)));
        }

        //
        // POST: /Parcel/Delete/5
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            Repository.RemoveParcel(id);
            return RedirectToAction("Index");
        }

        private PrzesylkiViewModel LoadPrzesylkiViewModel(Przesylki przesylka) 
        {
            PrzesylkiViewModel przesylkaViewModel = new PrzesylkiViewModel();
            przesylkaViewModel.ID = przesylka.ID;
            przesylkaViewModel.DataReaktywacji = przesylka.DataReaktywacji;
            przesylkaViewModel.Timestamp = przesylka.Timestamp;
            przesylkaViewModel.Status = przesylka.Statusy.Nazwa;
            przesylkaViewModel.Nadawca = string.Format("{0} {1}", przesylka.Klienci.Imie, przesylka.Klienci.Nazwisko);
            przesylkaViewModel.NadawcaAdres =  przesylka.Klienci.Adres;
            przesylkaViewModel.NadawcaRegion = przesylka.Klienci.Subregiony.Regiony.Nazwa;
            przesylkaViewModel.NadawcaSubregion = przesylka.Klienci.Subregiony.Nazwa;
            przesylkaViewModel.NadawcaMagazyn = przesylka.Klienci.Subregiony.Regiony.Magazyny.Single(m => m.Nazwa.Contains(przesylka.Klienci.Subregiony.Nazwa)).Nazwa;
            przesylkaViewModel.NadawcaDostawca = string.Format("{0} {1}", przesylka.Klienci.Subregiony.Dostawcy.Imie, przesylka.Klienci.Subregiony.Dostawcy.Nazwisko);
            przesylkaViewModel.Odbiorca = string.Format("{0} {1}", przesylka.Klienci1.Imie, przesylka.Klienci1.Nazwisko);
            przesylkaViewModel.OdbiorcaAdres = przesylka.Klienci1.Adres;
            przesylkaViewModel.OdbiorcaRegion = przesylka.Klienci1.Subregiony.Regiony.Nazwa;
            przesylkaViewModel.OdbiorcaSubregion = przesylka.Klienci1.Subregiony.Nazwa;
            przesylkaViewModel.OdbiorcaMagazyn = przesylka.Klienci1.Subregiony.Regiony.Magazyny.Single(m => m.Nazwa.Contains(przesylka.Klienci1.Subregiony.Nazwa)).Nazwa;
            przesylkaViewModel.OdbiorcaDostawca = string.Format("{0} {1}", przesylka.Klienci1.Subregiony.Dostawcy.Imie, przesylka.Klienci1.Subregiony.Dostawcy.Nazwisko);
            CompleteInformationAboutDelivery(przesylkaViewModel);
            return przesylkaViewModel;
        }

        private void CompleteInformationAboutDelivery(PrzesylkiViewModel przesylka) 
        {
            StringBuilder infoSB = new StringBuilder();
            if(przesylka.NadawcaSubregion == przesylka.OdbiorcaSubregion)
            {
                infoSB.Append(string.Format("<div><p>Nadawca i odbiorca w tym samym subregionie <b>{0}</b> (Region: <b>{1}</b>)</p></div><div><p>Od nadawcy do odbiorcy przesyłkę dostarcza: <b>{2}</b></p></div>", przesylka.NadawcaSubregion, przesylka.NadawcaRegion, przesylka.NadawcaDostawca));
            }
            else
            {
                if(przesylka.NadawcaRegion == przesylka.OdbiorcaRegion)
                {
                    infoSB.Append(string.Format("<div><p>Nadawca i odbiorca w różnych subregionach <b>{0}</b> i <b>{1}</b> ale w tym samym regionie (Region: <b>{2}</b>)</p></div>", przesylka.NadawcaSubregion, przesylka.OdbiorcaSubregion, przesylka.NadawcaRegion));
                    if (przesylka.NadawcaDostawca != przesylka.OdbiorcaDostawca)
                    {
                        infoSB.Append(string.Format("<div><p>Od nadawcy do magazynu <b>{0}</b> przesyłkę dostarcza: <b>{1}</b></p><p>Z magazynu <b>{2}</b> do odbiorcy przesyłkę dostarcza: <b>{3}</b></p></div>", przesylka.NadawcaMagazyn, przesylka.NadawcaDostawca, przesylka.OdbiorcaMagazyn, przesylka.OdbiorcaDostawca));
                    }
                    else
                    {
                        infoSB.Append(string.Format("<div><p>Od nadawcy do magazynu <b>{0}</b> i z magazynu <b>{1}</b> przesyłkę do odbiorcy dostarcza: <b>{2}</b></p></div>", przesylka.NadawcaMagazyn, przesylka.OdbiorcaMagazyn, przesylka.NadawcaDostawca));
                    }
                }else
                {
                    infoSB.Append(string.Format("<div><p>Nadawca i odbiorca w różnych regionach <b>{0}</b> i <b>{1}</b></p></div><div><p>Od nadawcy do magazynu <b>{2}</b> przesyłkę dostarcza: <b>{3}</b></p><p>Z magazynu <b>{4}</b> do odbiorcy przesyłkę dostarcza: <b>{5}</b></p></div>", przesylka.NadawcaRegion, przesylka.OdbiorcaRegion, przesylka.NadawcaMagazyn, przesylka.NadawcaDostawca, przesylka.OdbiorcaMagazyn, przesylka.OdbiorcaDostawca));
                }
            }
            przesylka.Info = infoSB.ToString();
        }

        private PrzesylkiChangeViewModel LoadPrzesylkiChangeViewModel(Przesylki przesylki)
        {
            PrzesylkiChangeViewModel przesylkiChangeViewModel = new PrzesylkiChangeViewModel();
            przesylkiChangeViewModel.ID = przesylki.ID;
            przesylkiChangeViewModel.Status = przesylki.Status;
            przesylkiChangeViewModel.Statusy = new List<SelectListItem>();
            przesylkiChangeViewModel.Statusy.AddRange(Repository.GetStatusesSelectItemListForSupervisor());
            return przesylkiChangeViewModel;
        }

    	public ActionResult GetSubregionsForRegion(string region) 
        {
            var subregiony = Repository.GetAllSubregionsForRegion(Convert.ToInt32(region));
            var subregionySL = new List<SelectListItem>();

            subregionySL.Add(new SelectListItem() { Text = "", Value = "0" });

            foreach (var item in subregiony) 
            {
                subregionySL.Add(new SelectListItem() { Text=item.Nazwa, Value=item.ID.ToString()});
            }
            return Json(subregionySL, JsonRequestBehavior.AllowGet);
        }

        private IEnumerable<PrzesylkiIndexViewModel> LoadPrzesylkiIndexViewModel(IEnumerable<Przesylki> przesylki)
        {
            List<PrzesylkiIndexViewModel> przesylkiList = new List<PrzesylkiIndexViewModel>();

            foreach (var przesylka in przesylki) 
            {
                PrzesylkiIndexViewModel przesylkaTmp = new PrzesylkiIndexViewModel();
                przesylkaTmp.ID = przesylka.ID;
                przesylkaTmp.Timestamp = przesylka.Timestamp;
                przesylkaTmp.Status = przesylka.Statusy.Nazwa;
                przesylkaTmp.Nadawca = string.Format("{0} {1}", przesylka.Klienci.Imie, przesylka.Klienci.Nazwisko);
                przesylkaTmp.NadawcaRegion = przesylka.Klienci.Subregiony.Regiony.Nazwa;
                przesylkaTmp.NadawcaSubregion = przesylka.Klienci.Subregiony.Nazwa;
                przesylkaTmp.NadawcaMagazyn = przesylka.Klienci.Subregiony.Regiony.Magazyny.Single(m => m.Nazwa.Contains(przesylka.Klienci.Subregiony.Nazwa)).Nazwa;
                przesylkaTmp.NadawcaDostawca = string.Format("{0} {1}", przesylka.Klienci.Subregiony.Dostawcy.Imie, przesylka.Klienci.Subregiony.Dostawcy.Nazwisko);
                przesylkaTmp.Odbiorca = string.Format("{0} {1}", przesylka.Klienci1.Imie, przesylka.Klienci1.Nazwisko);
                przesylkaTmp.OdbiorcaRegion = przesylka.Klienci1.Subregiony.Regiony.Nazwa;
                przesylkaTmp.OdbiorcaSubregion = przesylka.Klienci1.Subregiony.Nazwa;
                przesylkaTmp.OdbiorcaMagazyn = przesylka.Klienci1.Subregiony.Regiony.Magazyny.Single(m => m.Nazwa.Contains(przesylka.Klienci1.Subregiony.Nazwa)).Nazwa;
                przesylkaTmp.OdbiorcaDostawca = string.Format("{0} {1}", przesylka.Klienci1.Subregiony.Dostawcy.Imie, przesylka.Klienci1.Subregiony.Dostawcy.Nazwisko);
                przesylkiList.Add(przesylkaTmp);
            }
            return przesylkiList;
        }
    }
}